package 简单.模拟;

import java.util.Arrays;

/**
 * 图像平滑器 是大小为 3 x 3 的过滤器，用于对图像的每个单元格平滑处理，平滑处理后单元
 * 格的值为该单元格的平均灰度。
 * 每个单元格的  平均灰度 定义为：该单元格自身及其周围的 8 个单元格的平均值，结果需向
 * 下取整。（即，需要计算蓝色平滑器中 9 个单元格的平均值）。
 * 如果一个单元格周围存在单元格缺失的情况，则计算平均灰度时不考虑缺失的单元格（即，需
 * 要计算红色平滑器中 4 个单元格的平均值）。
 * 给你一个表示图像灰度的 m x n 整数矩阵 img ，返回对图像的每个单元格平滑处理后的图像 。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/image-smoother
 */
public class 图片平滑器_661 {

    public static void main(String[] args) {

        // [100,200,100],
        // [200,50,200],
        // [100,200,100]

        // [137,141,137],
        // [141,138,141],
        // [137,141,137]

        int[][] img = {{100, 200, 100}, {200, 50, 200}, {100, 200, 100}};
        for (int[] ints : imageSmoother(img)) {
            System.out.println(Arrays.toString(ints));
        }

    }

    /**
     * 直接模拟，定义8个方向
     * img = [[100,200,100],[200,50,200],[100,200,100]]
     * 输出: [[137,141,137],[141,138,141],[137,141,137]]
     * 细节：所有的平滑都在原数组中进行
     *
     * @param img
     * @return
     */
    public static int[][] imageSmoother(int[][] img) {
        int rows = img.length, columns = img[0].length;
        int[][] ans = new int[rows][columns];
        int[][] direction = {{-1, 0}, {-1, -1}, {-1, 1}, {0, -1}, {0, 1}, {1, 0}, {1, 1}, {1, -1}};

        for (int row = 0; row < rows; row++) {
            for (int column = 0; column < columns; column++) {
                // 需要加上自己
                int sum = img[row][column], count = 1;
                for (int[] direct : direction) {
                    int nextRow = direct[0] + row;
                    int nextColumn = direct[1] + column;
                    if (nextRow >= 0 && nextRow < rows && nextColumn >= 0 && nextColumn < columns) {
                        count++;
                        sum += img[nextRow][nextColumn];
                    }
                }
                ans[row][column] = sum / count;
            }
        }
        return ans;
    }

    // TODO 前缀和？？？

}
